package com.itheima.springbootwebtlias.mapper;

import com.github.pagehelper.Page;
import com.itheima.springbootwebtlias.pojo.Emp;
import com.itheima.springbootwebtlias.pojo.EmpQueryParam;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

@Mapper
public interface EmpMapper {
    //多条件查询
    //@Select("select e.*,d.* from emp e left join dept d on e.dept_id=d.id where e.name like concat('%',#{name},'%')  and gender=#{gender} and entry_date between #{begin} and #{end}")
    Page<Emp> selectByCondition(EmpQueryParam queryParam);

    //添加员工信息
    void insert(Emp emp);

    //批量删除员工
    void deleteBatchById(List<Integer> ids);

    //根据id查询员工
    @Select("select * from emp where id = #{id};")
    Emp selectById(Integer id);


    //更新员工
    void update(Emp emp);

    //查询全部员工
    List<Emp> selectAllEmp();


    @Select("select count(*) from emp where dept_id = #{id};")
    Integer selectByDeptId(Integer id);

    @MapKey("name")
    List<Map> jobCount();

    @MapKey("name")
    List<Map> genderCount();

    //根据用户名查询员工
    @Select("select * from emp where username = #{username};")
    Emp selectByUsername(String username);
}
/**
 * Service分页插件底层原理
 *

 //一、mybatis框架实现持久层开发：
 class  EmpMapperProxy  implements  EmpMapper{

 List<Emp> selectByCondition(EmpQueryParam queryParam){
 //1.从数据库连接池中获取连接对象
 //2.从当前方法上解析出SQL语句
 //3.使用反射设置参数
 //4.获取PreparedStatement,发送SQL语句
 //5.使用反射解析结果数据到List<Emp>集合中
 }

 }

 //二、mybatis创建的持久层实现类对象，存储到ioc容器中了
 //三、业务层service中
 1.在业务层配置了分页插件
 2.从容器中获取持久层对象EmpMapperProxy查询数据时被mybatis拦截器拦截，功能增强：动态代理
 3.mybatis拦截器功能增强：
 1.根据页码，计算起始位置
 2.获取原方法的SQL语句，追加limit  起始位置，页码
 3.单独发起select count(*)  sql语句，查询总记录数
 4.将查询结果封装到Page对象，返回
 */